//
//  06_04.c
//  tasks
//
//  Created by Daniel on 2024/6/4.
//

#include <stdio.h>
#include <stdlib.h>
//int Add(int x,int y)
//{
//    return x + y;
//}
//int main()
//{
//    int a = 3;
//    int b = 6;
////    int res = Add(a,b);
//    int (* pf)(int,int) = &Add;
//    int res = (pf)(a,b);
//    printf("%d\n",res);
//    return 0;
//}


//void menu(void)
//{
//    printf("************************************\n");
//    printf("***********1. add  2. sub **********\n");
//    printf("***********3. mul  4. div **********\n");
//    printf("***********    0. exit    **********\n");
//    printf("************************************\n");
//}
//int Add(int x,int y)
//{
//    return x + y;
//}
//
//int Sub(int x,int y)
//{
//    return x - y;
//}
//
//int Mul(int x,int y)
//{
//    return x * y;
//}
//
//int Div(int x,int y)
//{
//    return x / y;
//}
//
//void calc(int (*pf)(int, int))
//{
//    int x = 0;
//    int y = 0;
//    int ret;
//    printf("输入两个操作数:>");
//    scanf("%d %d",&x, &y);
//    ret = pf(x, y);
//    printf("%d\n",ret);
//}
//
//int main()
//{
//    int input = 0;
//    do
//    {
//        menu();
//        printf("请选择:>");
//        scanf("%d",&input);
//        switch(input)
//        {
//            case 1:
//                calc(Add);
//                break;
//            case 2:
//                calc(Sub);
//                break;
//            case 3:
//                calc(Mul);
//                break;
//            case 4:
//                calc(Div);
//                break;
//            case 0:
//                printf("退出计算器\n");
//                break;
//            default:
//                printf("选择错误！！\n");
//                break;
//        }
//    }while(input);
//    return 0;
//}

//void menu(void)
//{
//    printf("************************************\n");
//    printf("***********1. add  2. sub **********\n");
//    printf("***********3. mul  4. div **********\n");
//    printf("***********    0. exit    **********\n");
//    printf("************************************\n");
//}
//int Add(int x,int y)
//{
//    return x + y;
//}
//
//int Sub(int x,int y)
//{
//    return x - y;
//}
//
//int Mul(int x,int y)
//{
//    return x * y;
//}
//
//int Div(int x,int y)
//{
//    return x / y;
//}
//
//int main()
//{
//    int input = 0;
//    int x = 0;
//    int y = 0;
//    int ret;
//    //函数指针函数
//    int (*arr[])(int,int) = {0, Add, Sub, Mul, Div};
//    do
//    {
//        menu();
//        printf("请选择:>");
//        scanf("%d",&input);
//        if(input == 0)
//        {
//            printf("退出计算器\n");
//        }
//        else if (input >= 1 && input <= 4)
//        {
//            printf("输入两个操作数:>");
//            scanf("%d %d", &x, &y);
//            int res = arr[input](x,y);
//            printf("%d\n",res);
//        }
//        else
//        {
//            printf("选择错误！！\n");
//        }
//    }while(input);
//    return 0;
//}


//void qsort();有以下参数⬇️
//void qsort(void* base,//待排序的数据的起始位置；
//           size_t num,//待排序的元素的个数；
//           size_t width,//待排序的数据元素的大小(单位是字节,1byte=>8bit)
//           int(* cmp)(const void* e1,const void* e2)//函数指针-比较函数
//           );

int cmp_int(const void* e1,const void* e2)
{
    return (*(int*)e1 - *(int*)e2);
}

void Swap(char* buf1,char* buf2,int width)
{
    for(int i = 0; i < width; i++)
    {
        char tmp = *buf1;
        *buf1 = *buf2;
        *buf2 = tmp;
        buf1++;
        buf2++;
    }
}

void bubble_sort(void* base, int sz, int width, int (*cmp)(const void*e1, const void*e2))
{
    //    趟数
    for (int i = 0; i < sz - 1; i++)
    {
        int flag = 1;//假设数组是排好序的
        //        一趟冒泡排序的过程
        for(int j = 0; j < sz - 1 - i;j++)
        {
            if(cmp((char*)base+j*width, (char*)base+(j+1)*width)>0)
            {
                Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);//交换
                flag = 0;
            }
        }
        if(flag == 1)
        {
            break;
        }
    }
}

int main()
{
    int arr[] = {1,2,3,4,55,7,8,99,};
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
//    qsort(arr, sz, sizeof(arr[0]), cmp_int);
    for(int i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}
